<?php
/**
 * HTTP响应类模块
 * 
 * @author jlpay-sdk-php
 * @version 1.0.0
 */

namespace JLPay\Core\Http;

/**
 * HTTP响应类
 */
class HttpResponse
{
    /**
     * 响应体
     * @var string|null
     */
    public $body;
    
    /**
     * HTTP状态码
     * @var int|null
     */
    public $status;
    
    /**
     * 响应头
     * @var array
     */
    public $headers;
    
    /**
     * 初始化响应对象
     */
    public function __construct()
    {
        $this->body = null;
        $this->status = null;
        $this->headers = [];
    }
    
    /**
     * 获取响应体
     * 
     * @return string|null
     */
    public function getBody()
    {
        return $this->body;
    }
    
    /**
     * 设置响应体
     * 
     * @param string $body 响应体内容
     * @return self
     */
    public function setBody($body)
    {
        $this->body = $body;
        return $this;
    }
    
    /**
     * 获取HTTP状态码
     * 
     * @return int|null
     */
    public function getStatus()
    {
        return $this->status;
    }
    
    /**
     * 设置HTTP状态码
     * 
     * @param int $status HTTP状态码
     * @return self
     */
    public function setStatus($status)
    {
        $this->status = $status;
        return $this;
    }
    
    /**
     * 获取响应头
     * 
     * @return array
     */
    public function getHeaders()
    {
        return $this->headers;
    }
    
    /**
     * 设置响应头
     * 
     * @param array $headers 响应头数组
     * @return self
     */
    public function setHeaders(array $headers)
    {
        $this->headers = $headers;
        return $this;
    }
    
    /**
     * 获取指定的响应头
     * 
     * @param string $name 响应头名称
     * @param string|null $default 默认值
     * @return string|null
     */
    public function getHeader($name, $default = null)
    {
        return $this->headers[$name] ?? $default;
    }
    
    /**
     * 设置单个响应头
     * 
     * @param string $name 响应头名称
     * @param string $value 响应头值
     * @return self
     */
    public function setHeader($name, $value)
    {
        $this->headers[$name] = $value;
        return $this;
    }
    
    /**
     * 将响应体解析为JSON
     * 
     * @param bool $assoc 是否返回关联数组
     * @return mixed
     * @throws \JsonException
     */
    public function json($assoc = true)
    {
        if ($this->body === null) {
            return null;
        }
        
        return json_decode($this->body, $assoc, 512, JSON_THROW_ON_ERROR);
    }
    
    /**
     * 检查响应是否成功（状态码200-299）
     * 
     * @return bool
     */
    public function isSuccessful()
    {
        return $this->status >= 200 && $this->status < 300;
    }
} 